package main

import (
	"fmt"
	"sync/atomic"
	"time"
)

/*
原子操作。
在Go语言中，没有像Java中的volatile关键字这样的特定关键字来确保可见性。然而，Go语言通过其并发模型和内存模型，提供了对并发安全的保证，从而确保可见性。
通过使用sync/atomic包中的函数，可以实现对基本数据类型的原子操作。这些操作被设计为对并发操作的安全，并且能够确保可见性。
*/
func main() {
	var counter int32
	var counter2 int32

	// 启动一个goroutine来更新计数器
	for i := 0; i < 100; i++ {
		go func() {
			for i := 0; i < 100; i++ {
				// 使用atomic.AddInt32进行原子操作
				atomic.AddInt32(&counter, 1)
				counter2++
			}
		}()
	}

	// 主goroutine等待一段时间后读取计数器的值
	time.Sleep(2 * time.Second)
	// 使用atomic.LoadInt32读取计数器的值,应该是1W就对了
	value := atomic.LoadInt32(&counter)
	fmt.Println("原子性操作：Counter value:", value, ", is Ok:", value == 10000)
	fmt.Println("非原子性操作：Counter value2:", counter2, ", is Ok:", counter2 == 10000)
}
